#include <iostream>
#include <unistd.h>    //sleep和getpid需要
#include <sys/types.h> //系统调用需要
#include <signal.h>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>

using std::cin;
using std::cout;
using std::endl;

void handler(int signo)
{
    cout << "进程捕捉到了一个信号，信号的编号是：" << signo << endl;
}

int main()
{
    for (size_t i = 0; i < 32; ++i)
    {
        signal(i, handler);
    }
    while (1)
    {
        cout << "你好！我是..." << getpid() << endl;
        sleep(1);
    }
    return 0;
}

// int main()
// {
//     while (1)
//     {
//         int a[10];
//         a[100] = 111;//这里不一定会崩溃，根据不同的编译器底层实现原理来决定的 —— 所以越界操作不一定会导致程序崩溃 —— os也不一定能百分百检查出来越界操作
//         a[1000] = 111;//我们数组只要了10个空间，但是我们的栈区可能不止10个空间，所以我们对数组的越界访问，如果没有越过有效的栈空间，就不会报错
//         //a[10000] = 111;//所以就会发生 —— 数据发生了变化，而我们毫不知情等一系列问题！
//     }
//     return 0;
// }

// int cnt = 0; // 定义为全局的

// void handler(int signo)
// {
//     cout << "进程捕捉到了一个信号，信号的编号是：" << cnt << endl;
//     // exit(1);不终止进程
//     // alarm(1);
// }

// int main()
// {
//     alarm(10);                // 统计计算机，1s能将数据累加多少次
//     signal(SIGALRM, handler); // 如果一切正常，那么handler方法不会被调用，当触发了除0错误，收到了SIGFPE8号信号，就自动调用

//     while (1)
//     {
//         cnt++;
//         if (cnt == 5)
//         {
//             auto num = alarm(0);
//             cout << num << endl;
//         }
//         sleep(1);
//     }

//     return 0;
// }

// void handler(int signo)
// {
//     cout << "进程捕捉到了一个信号，信号的编号是：" << signo << endl;
//     sleep(1);
// }
// int main()
// {
//     // signal(SIGFPE, handler); // 如果一切正常，那么handler方法不会被调用，当触发了除0错误，收到了SIGFPE8号信号，就自动调用
//     // while (1)
//     //{
//     // int a = 10;
//     // a /= 0;

//     int *p = nullptr;
//     p = nullptr;//p的类型是int *类型，所以p可以被赋值为0
//     *p = 100;//*p对p进行解引用，解引用p拿到0地址处，0地址处是不允许我们做修改，赋值的！
//     //}
//     return 0;
// }

// int main()
// {
//     int count = 0;
//     while (count <= 7)
//     {
//         printf("%d\n", count++); // 这里c打印比c++代码简单
//         sleep(1);
//         if (count > 3)
//             //raise(3);
//             abort();
//     }
//     return 0;
// }

// static void Usag(const std::string &proc) // 使用该进程的手册
// {
//     cout << "\nUsag :" << proc << "pid signo\n"
//          << endl;
// }
// int main(int argc, char *argv[]) // 使用规则 ： ./myprocess pid signo（字符串）
// {
//     if (argc != 3) // 如果argc不等于3，也就是使用规则错误
//     {
//         Usag(argv[0]);
//         exit(1);
//     }
//     pid_t pid = atoi(argv[1]); //   ./myprocess pid signo都是以字符串的形式传进来的
//     int signo = atoi(argv[2]); //  我们需要转成对应的类型

//     int n = kill(pid, signo);
//     if (n != 0)
//     {
//         std::cerr << "errno" << strerror(n) << endl;
//         perror("kill"); // 出错打印
//     }
//     return 0;
// }

// void handler(int signo) // 参数是信号编号，函数名可以随便写的
// {
//     cout << "进程捕捉到了一个信号，信号的编号是：" << signo << endl;
// }
// int main()
// {
//     signal(2, handler);//这里是signal函数的调用，并不是handler函数的调用
//     //仅仅是设置了对2号信号的捕捉方法，并不代表该方法被调用了
//     //一般这个方法不会被执行，除非捕捉到了对应的信号！
//     while (1)
//     {
//         cout << "我是一个进程：" << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }